package com.yz.LinkList;

public class DoubleLinkListDemo {
    public static void main(String[] args) {
        //双向链表的测试

        //创建对象
        HeroNode2 node1 = new HeroNode2(1, "李白", "小李");
        HeroNode2 node2 = new HeroNode2(2, "王伟", "小王");
        HeroNode2 node3 = new HeroNode2(3, "白居易", "小白");
        DoubleLinkList doubleLinkList = new DoubleLinkList();

        //添加元素进去
        doubleLinkList.add(node1);
        doubleLinkList.add(node2);
        doubleLinkList.add(node3);
        doubleLinkList.show();

        System.out.println();

        //修改元素
        HeroNode2 node22 = new HeroNode2(2, "王哥", "老王");
        doubleLinkList.edit(node22);
        doubleLinkList.show();

        System.out.println();

        //删除元素
        doubleLinkList.del(3);
        doubleLinkList.show();
    }
}

class DoubleLinkList{
    //在这个类中实现双向链表的增删改查

    //1.创建这个链表，进行初始化
    private HeroNode2 head=new HeroNode2(0,"","");

    //因为头结点是私有的，所以定义一个方法来返回
    public HeroNode2 getHead() {
        return head;
    }

    //2.添加元素
    //因为自己定义的head不能动。所以只能用一个辅助变量来操作、
    //添加元素到双向链表的最后
    public void add(HeroNode2 heroNode2){
        //找该链表的最后位置
        HeroNode2 temp = head;
        while (true){
            if (temp.next == null){
                break;
            }
            //没有找到，就一直将temp后移
            temp = temp.next;  //遍历
        }
        //找到最后之后，就将元素添加进去
        //形成双向链表
        temp.next = heroNode2;
        heroNode2.pre = temp;

    }



    //3.修改元素
    public void edit(HeroNode2 newHeronode) {
        //创建临时变量
        HeroNode2 temp = head;
        Boolean flag = false;
        while (true) {
            if (temp.next == null) {
                break; //到达了链表的最后位置了
            }
            if (temp.no == newHeronode.no) {
                //说明位置找到了，就是在这个位置进行插入
                flag = true;
                break;
            }
            //后移，遍历当前链表
            temp = temp.next;
        }
        if (flag) {
            //这是表示找到了
            //然后进行替换
            temp.name = newHeronode.name;
            temp.nickname = newHeronode.nickname;
        } else {
            //这表示没有找到
            System.out.printf("该链表中没有找到该编号为：%d的数据,不能进行修改！", temp.no);
        }

    }

    //4.查找元素
    public void show() {
        if (head.next == null) {
            //表示该链表是空的
            System.out.println("该链表是空的，无法展示");
            return;
        }
        HeroNode2 temp = head.next;
        while (true) {
            if (temp == null) {
                //说明已经遍历到最后一个
                break;
            } else {
                //接下来开始遍历
                //因为我们重写了toString方法，所以直接展示
                System.out.println(temp);
                //一定要将temp后移，要不然娶不到后面元素
                temp = temp.next;
            }
        }
    }

    //5.删除元素
    //传入的是该编号，然后通过编号来删除
    //删除这个节点，直接可以找到本节点，不用找到上一个节点
    public void del(int no) {
        //判断当前链表是否为空
        if (head.next == null){
            System.out.println("该链表是空的");
            return;
        }

        //由于head不能动，所以就定义一个临时变量
        HeroNode2 temp = head.next;
        Boolean flag = false;
        while (true) {
            if (temp == null) {
                //表示到达了链表的最后位置
                break;
            } else if (temp.no == no) {
                //表示找到了要删除的位置
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag) {
            //这是就表示找到了，并且要删除
            //删除逻辑，跳过这个节点
            temp.pre.next=temp.next;
            if (temp.next != null){  //最后一个节点还用这个会触发空指针异常，所以做个判断
                temp.next.pre=temp.pre;
            }
        } else {
            System.out.printf("该链表中没有找到该编号为：%d的数据", no);
        }
    }




}



class HeroNode2 {
    int no;
    String name;
    String nickname;
    HeroNode2 next;
    HeroNode2 pre;

    public HeroNode2(int no, String name, String nickname) {
        this.no = no;
        this.name = name;
        this.nickname = nickname;
    }

    @Override
    public String toString() {
        return "HeroNode{" +
                "no=" + no +
                ", name='" + name + '\'' +
                ", nickname='" + nickname +
                '}';
    }
}


